group by的用法

group by的常规用法

group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。

  • 创建数据库表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE `user_info` (
    `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
    `user_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户编号',
    `grade` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '年级',
    `class` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '班级',
    PRIMARY KEY (`id`),
    UNIQUE INDEX `uniq_user_id` (`user_id`)
    )
    ENGINE=InnoDB
  • 插入数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (10, '10230', 'C', 'B');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (9, '10229', 'C', 'a');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (8, '10228', 'B', 'b');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (7, '10227', 'B', 'b');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (6, '10226', 'B', 'a');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (5, '10225', 'B', 'a');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (4, '10224', 'A', 'b');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (3, '10223', 'A', 'b');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (2, '10222', 'A', 'a');
    INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (1, '10221', 'A', 'a');
  • 配合max聚合函数筛选数据

    1
    select max(user_id), grade from user_info group by grade;

    这条sql语句的意思就是将数据按照grade字段进行分组,查询每组最大的user_id以及当前组内容,这里的分组条件是grade,查询的非聚合条件是grade。

  • 结果

    | max(user_id) | grade |
    | ———— | —– |
    | 10224 | A |
    | 10228 | B |
    | 10230 | C |

  • 配合having进行筛选后过滤

    1
    select max(user_id), grade from user_info group by grade having grade > 'A';
  • 结果

    | max(user_id) | grade |
    | ———— | —– |
    | 10228 | B |
    | 10230 | C |

group by的非常规用法

1
select max(user_id), id, grade from user_info group by grade;

结果为:

max(user_id) id grade
10224 1 A
10228 5 B
10230 9 C

与上述例子不同的是,查询条件多了id一列。数据按照grade分组后,grade一列是相同的,max(user_id)按照数据进行计算也是唯一的,id一列是如何取值的?看上述的数据结果,
推论:id是物理内存的第一个匹配项。

结论

  • 当group by 与聚合函数配合使用时,功能为分组后计算
  • 当group by 与having配合使用时,功能为分组后过滤
  • 当group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容。

说明

本文转自mysql中group by 的用法解析